import XLSX from 'xlsx'

const IMPORT_ERR_MSG = '导入失败，请检查文件！'

function transformExcelToLucky(file, callback) {
  if (!checkExcelFile(file.name)) {
    // eslint-disable-next-line no-alert
    alert('文件类型必须是.xlsx,xls中的一种')
    return
  } // 支持Safari6.0以上，Opera12.02以上，IE10以上，chrome7以上

  let sheetList = null

  const reader = new FileReader()

  reader.onload = function (e) {
    try {
      sheetList = _parseExcel(e.target.result)
    }
    catch (err) {
      // eslint-disable-next-line no-alert
      alert(IMPORT_ERR_MSG)
    } // callback在try外执行，否则callback报的错也会被catch

    if (sheetList !== null) {
      const exportJson = {
        sheets: Object.keys(sheetList).map(name => ({ name })),
        info: Object.keys(sheetList).map(name => ({ name, ...sheetList[name] })),
      }
      callback(exportJson)
    }
  }

  reader.onerror = function () {
    // eslint-disable-next-line no-alert
    alert(IMPORT_ERR_MSG)
  } // 读取文件的 ArrayBuffer 数据对象 ArrayBuffer 对象用来表示通用的、固定长度的原始二进制数据缓冲区

  reader.readAsArrayBuffer(file)
  /**
   * 根据文件名判断是否为excel文件
   * @param filename 文件名
   * @return {boolean} true: 为excel文件 false: 不为excel文件
   */

  function checkExcelFile(filename) {
    if (!filename)
      return false
    const suffix = filename.substr(filename.lastIndexOf('.'))
    return suffix === '.xls' || suffix === '.xlsx'
  }
  /**
   * 将ArrayBuffer 数据对象处理为字符串 http://javascript.ruanyifeng.com/stdlib/arraybuffer.html
   * @param data ArrayBuffer 数据
   */

  const fixdata = function fixdata(data) {
    let str = ''
    let l = 0
    const w = 10240

    for (; l < data.byteLength / w; ++l)
      str += String.fromCharCode.apply(null, new Uint8Array(data.slice(l * w, l * w + w)))

    str += String.fromCharCode.apply(null, new Uint8Array(data.slice(l * w)))
    return str
  }
  /**
   * 获取头部项
   * @param sheet worksheet数据
   * @return {Array}
   */

  function _parseExcel(data) {
    const fixedData = fixdata(data) // btoa是binary to ascii 将binary的数据用ascii码表示

    const workbook = XLSX.read(btoa(fixedData), {
      type: 'base64',
    }) // 读取多个sheet表

    const sheetList = workbook.Sheets

    return sheetList
  }
}

export { transformExcelToLucky }
